--- title: "7、全球变暖" created: 2025-11-28 tags: - 算法 --- # 7、全球变暖 ## 题目 [全球变暖](https://www.lanqiao.cn/paper/3854/problem/178/) ![[image-422f1f5f.png]] ## 思路分析 模拟 dfs统计涨水前的岛屿数量 进行涨水操作(注意不要对每个都进行操作 而是记录下来最后统一操作 避免涨了 又涨的情况 即状态被前面的操作改变 最后可能导致全被淹没) 然后再统计一遍涨水后的岛屿数量 相减就是答案 ```cpp #include using namespace std; typedef pair PII; const int N = 1010; string s[N]; bool visited[N][N]; int n; void dfs(int x, int y) { if (x < 0 || x >= n || y < 0 || y >= n || s[x][y] == '.' || visited[x][y]) return; visited[x][y] = true; dfs(x-1, y); // 上 dfs(x+1, y); // 下 dfs(x, y-1); // 左 dfs(x, y+1); // 右 } int main() { cin >> n; for (int i = 0; i < n; i++) cin >> s[i]; // cout< to_change; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (s[i][j] == '.') { if (i > 0) to_change.push_back({i - 1, j}); if (j < n - 1) to_change.push_back({i, j + 1}); if (i < n - 1) to_change.push_back({i + 1, j}); if (j > 0) to_change.push_back({i, j - 1}); } } } for(auto idx:to_change){ int x=idx.first,y=idx.second; s[x][y]='.'; } int new_blocks = 0; memset(visited, false, sizeof visited); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { // cout< using namespace std; #define endl '\n' const int N=1010; char g[N][N]; bool st[N][N]; int n; int all,cnt; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; bool isVaild(int x,int y){ return x>=0 && x<=n-1 && y>=0 && y<=n-1; } void dfs(int x,int y,bool &live){ //不知道为什么 剪枝会错 哦知道了 提前退出会导致岛没被拓展完全 使得没被标记 //if(live==true) return; //只要找到一个4周都不是水的 就说明整个岛不会完全消失 if(live==false){ int cntland=0; for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(g[nx][ny]!='.') cntland++; } if(cntland==4) live=true; } for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(isVaild(nx,ny) && g[nx][ny]=='#' && !st[nx][ny]){ st[nx][ny]=true; dfs(nx,ny,live); } } } int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n; for(int i=0;i>g[i]; for(int i=0;i